package com.yunfeng.master.infrastructure.context;



import com.yunfeng.master.infrastructure.dto.BaseDTO;

import java.util.Optional;

/**
 * 泛型上下文持有器，支持所有继承BaseDTO的子类
 * 采用ThreadLocal实现线程隔离，避免内存泄漏
 * @author Jia boyan
 * @param <T> 泛型类型，必须继承BaseDTO
 * date 2025/6/13 13:43
 */
public class DTOContextHolder<T extends BaseDTO> {

    // 使用ThreadLocal确保线程安全，每个线程独立存储上下文[6,7](@ref)
    private static final ThreadLocal<? extends BaseDTO> contextHolder = new ThreadLocal<>();

    /**
     * 设置当前线程的上下文对象
     * @param context 泛型上下文对象（非空）
     * @throws IllegalArgumentException 如果传入null
     */
    @SuppressWarnings("unchecked")
    public void setContext(T context) {
        if (context == null) {
            throw new IllegalArgumentException("Context cannot be null");
        }
        // 类型安全的泛型设置[1,7](@ref)
        ((ThreadLocal<T>) contextHolder).set(context);
    }

    /**
     * 获取当前线程的上下文对象
     * @return Optional包装的上下文对象，避免空指针[4](@ref)
     */
    @SuppressWarnings("unchecked")
    public Optional<T> getContext() {
        // 安全类型转换[7](@ref)
        T context = (T) contextHolder.get();
        return Optional.ofNullable(context);
    }

    /**
     * 获取用户PIN（快捷方法）
     * @return 当前用户的pin，上下文不存在时返回null
     */
    public String getCurrentUserPin() {
        return getContext()
                .map(BaseDTO::getPin)
                .orElse(null);
    }

    /**
     * 获取用户名（快捷方法）
     * @return 当前用户的name，上下文不存在时返回null
     */
    public String getCurrentUserName() {
        return getContext()
                .map(BaseDTO::getName)
                .orElse(null);
    }

    /**
     * 清除当前线程的上下文（防止内存泄漏）[6,8](@ref)
     */
    public void clearContext() {
        contextHolder.remove();
    }
}